const fs = require('fs');
const path = require('path');
const {format} = require('date-fns'); // 若安装了date-fns
const packageContent = require('./package.json'); // 读取package.json


/**
 * 增加版本号（如 1.0.0 → 1.0.1）
 * @param version
 * @returns {string}
 */
function incrementVersion(version) {
    const [major, minor, patch] = version.split('.').map(Number);
    return `${major}.${minor}.${patch + 1}`;
}


/**
 * 更新.env.production文件内容
 * @param filePath
 * @param version
 * @param buildTime
 * @param timestamp
 * @returns {string}
 */
function updateEnvContent(filePath, version, buildTime, timestamp) {
    let envContent = fs.readFileSync(filePath, 'utf8') || '';

    // 正则表达式匹配现有变量或添加新变量
    const versionRegex = /VUE_APP_CLIENT_VERSION=.*/;
    const versionCodeRegex = /VUE_APP_CLIENT_VERSION_CODE=.*/;
    const buildTimeRegex = /VUE_APP_CLIENT_BUILD_TIME=.*/;

    const newVersionLine = `VUE_APP_CLIENT_VERSION='${version}'`;
    const newVersionCodeLine = `VUE_APP_CLIENT_VERSION_CODE='${timestamp}'`;
    const newBuildTimeLine = `VUE_APP_CLIENT_BUILD_TIME='${buildTime}'`;

    // 更新版本名称
    if (versionRegex.test(envContent)) {
        envContent = envContent.replace(versionRegex, newVersionLine);
    } else {
        envContent += `\n${newVersionLine}`;
    }

    // 更新版本号
    if (versionRegex.test(envContent)) {
        envContent = envContent.replace(versionCodeRegex, newVersionCodeLine);
    } else {
        envContent += `\n${newVersionCodeLine}`;
    }

    // 更新构建时间
    if (buildTimeRegex.test(envContent)) {
        envContent = envContent.replace(buildTimeRegex, newBuildTimeLine);
    } else {
        envContent += `\n${newBuildTimeLine}`;
    }

    return envContent;
}

module.exports = {
    lintOnSave: false,
    chainWebpack: (config) => {
        console.log('webpack钩子');

        // 只在生产环境打包时执行
        if (process.env.NODE_ENV === 'production') {
            // 1. 注册 Webpack 编译前钩子，用于更新 package.json 版本号
            config.plugin('update-package-version').use(class {
                apply(compiler) {
                    compiler.hooks.beforeRun.tapAsync('UpdatePackageVersion', (compilation, callback) => {
                        const packagePath = path.resolve(__dirname, 'package.json');
                        const versionPath = path.resolve(__dirname, 'public/version.json');
                        const envPath = path.resolve(__dirname, '.env.production');

                        // 读取原 JSON 文件内容
                        let packageContent = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
                        let versionContent = {};
                        if (fs.existsSync(versionPath)) {
                            versionContent = JSON.parse(fs.readFileSync(versionPath, 'utf8'))
                        }
                        // 编译日期
                        const date = new Date();
                        const buildTime = format(date, 'yyyy-MM-dd HH:mm:ss');
                        const timestamp = date.getTime();
                        versionContent.buildTime = buildTime;
                        // 增加版本号（如 1.0.0 → 1.0.1）
                        const oldVersion = packageContent.version;
                        const newVersion = incrementVersion(oldVersion);
                        // 更新版本号
                        packageContent.version = newVersion;
                        packageContent.versionCode = timestamp;
                        versionContent.version = newVersion;
                        versionContent.versionCode = timestamp;

                        fs.writeFileSync(packagePath, JSON.stringify(packageContent, null, 2), 'utf8', callback());
                        fs.writeFileSync(versionPath, JSON.stringify(versionContent, null, 2), 'utf8', callback());
                        fs.writeFileSync(envPath, updateEnvContent(envPath, newVersion, buildTime, timestamp), 'utf8', callback());

                        // 注入版本号、编译日期到环境变量
                        config.plugin('define').tap(args => {
                            console.log('注入版本号、编译日期到环境变量');
                            args[0]['process.env'].VUE_APP_CLIENT_VERSION = JSON.stringify(newVersion)
                            args[0]['process.env'].VUE_APP_CLIENT_VERSION_CODE = JSON.stringify(timestamp)
                            args[0]['process.env'].VUE_APP_CLIENT_BUILD_TIME = JSON.stringify(buildTime)
                            return args;
                        });

                        console.log(`编译后信息 version: ${newVersion}  versionCode: ${timestamp}  buildTime: ${buildTime}`)
                    });
                }
            });

            // 注册 Webpack 构建完成钩子（emit 阶段，资源输出前）
            // config.plugin('write-build-time').use(class {
            //     apply(compiler) {
            //         compiler.hooks.emit.tapAsync('WriteBuildTime', (compilation, callback) => {
            //             // 1. 定义要写入的 JSON 文件路径（输出目录的 version.json）
            //             const versionPath = path.resolve(__dirname, 'public/version.json');
            //             console.log('versionPath:', versionPath)
            //             // 或打包后的输出路径（dist/version.json）
            //             // const versionPath = path.resolve(__dirname, 'dist/version.json');
            //
            //             // 2. 获取当前时间（格式化）
            //             const buildTime = format(new Date(), 'yyyyMMddHHmmss');
            //             // 若未安装date-fns，可用原生方法：
            //             // const buildTime = new Date().toLocaleString();
            //
            //             // 3. 读取原 JSON 文件内容
            //             let versionContent = {};
            //             if (fs.existsSync(versionPath)) {
            //                 versionContent = JSON.parse(fs.readFileSync(versionPath, 'utf8'));
            //             }
            //
            //             // 4. 写入当前时间
            //             versionContent.version = packageContent.version; // 从package.json获取版本
            //             versionContent.buildTime = buildTime;
            //             // 5. 写回文件
            //             fs.writeFileSync(
            //                 versionPath,
            //                 JSON.stringify(versionContent, null, 2), // 格式化JSON，便于阅读
            //                 'utf8'
            //             );
            //
            //             callback();
            //         });
            //     }
            // });
            //
        }
    }
}
